#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <signal.h>
#include <syslog.h>

int main()
{
    // 第一步 fork 退出父进程
    pid_t pid = fork();
    if (pid < 0)
    {
        exit(1);
    }
    if (pid > 0)
    {
        exit(0);
    }

    // 第二步 创建会话，脱离终端
    pid_t sid = setsid();
    if (sid < 0)
    {
        exit(1);
    }

    // 第三步 再次调用fork
    pid = fork();
    if (pid < 0)
    {
        exit(1);
    }
    if (pid > 0)
    {
        exit(0);
    }

    // 第四步 改变工作目录
    chdir("/");

    // 打开日志文件
    openlog("testdaemon", LOG_PID, LOG_DAEMON);

    // 第五步 关闭文件描述符
	int max_fd = sysconf(_SC_OPEN_MAX);
	for(int i=0; i<max_fd; i++)
    {
		close(i);
    }

    // 第六步 设置文件权限掩码为0
    umask(0);

    // 守护进程的主循环
    while (1)
    {
        syslog(LOG_INFO, "Daemon running");
        sleep(60);
    }
}
// 后台运行 ./mydaemon & 
// 查看进程是否存在 pgrep mydaemon 
// 实时查看新日志 journalctl -f -t testdaemon
// 停止进程 killall mydaemon
